package ar.com.hakasoft

import ar.com.hakasoft.entities.Articulo
import ar.com.hakasoft.entities.Cliente
import ar.com.hakasoft.entities.Dietetica
import ar.com.hakasoft.entities.ItemFactura
import ar.com.hakasoft.entities.Vendedor
import ar.com.hakasoft.utils.DateUtil

class FacturacionController extends LoginController {

	def facturasService
	def beforeInterceptor = [action:this.&checkUser,except:[]]
	
    def index = { 
		putParams(params)
	}
	
	def show = {
		log.warn "entro al show: " + params.id
		putParams(params)
	}
	
	def imprimir = {
		log.warn "entro al imprimir"
		putParams(params)
	}
	
	def mostrarClientes = {
		log.warn "parametros mostrarClientes: " + params
		render (template:"/templates/comboClientes", model:[clientes:true])
	}
	
	def putParams(params){
		def factura = facturasService.obtenerFactura(params.id,session?.user?.username)
		def vendedoresList = Vendedor.list().sort{it.nombre}
		def dieteticasList = Dietetica.list().sort{it.nombre}
		def clientesList = Cliente.list().sort{it.nombre}
		[facturaInstance:factura,vendedoresList:vendedoresList, dieteticasList:dieteticasList, clientesList:clientesList, mapaTotales:getTotales(factura)]
	}
	
	def save = {
		def factura = facturasService.obtenerFactura(params.id,session?.user?.username)
		if (params.fecha){
			params.fecha = DateUtil.toDate(params.fecha)
		}
		factura.properties = params
		if (params?.clienteVendedor){
			params.cliente = params.clienteVendedor
		}
		
		def item = new ItemFactura(params)
		if (!item.hasErrors()){
			item.precioUnitario =  new BigDecimal (params.precioUnitario) // Convierto para que tome bien los decimales
			item.factura = factura
			factura.addToItemFactura(item)
			
			getTotal(factura)
			if (facturasService.guardarFactura(factura)){
				log.warn "No se puedo guardar la Factura: ${params?.id}"
			}
			render(template: "/templates/tablaItems", model: [listadoItems:factura?.itemFactura.sort{it?.id}, facturaInstance:factura, edit: true, mapaTotales:getTotales(factura)])
		}
	}
	
	private getTotales(factura){
		def mapaTotales = ["Total":factura.precioTotal]
		Articulo.list().each {
			mapaTotales["${it.descripcion}"] = 0
		}
		 factura.itemFactura.each { item ->
			 def descripcion = item.articulo.descripcion
			 mapaTotales["$descripcion"] += item.cantidad
		 }
		 return mapaTotales
		
	}
	
	private def getTotal(factura){
		BigDecimal total = new BigDecimal(0)
		factura.itemFactura.each { elem -> total += (elem?.precioUnitario * elem?.cantidad)  }
		factura?.precioTotal = total
	}
	
	
	def eliminarItem = {
		def factura = facturasService.eliminarItemFactura(params.id.toLong(), params.idItem.toLong())
		if (factura){
			getTotal(factura)
			render(template: "/templates/tablaItems", model: [listadoItems:factura?.itemFactura.sort{it?.id}, facturaInstance:factura, edit: true, mapaTotales:getTotales(factura)])
		}
	}
	
	def nuevaFactura = {
		def factura = facturasService.obtenerFactura(null,session?.user?.username)
		render(template: "/templates/tablaItems", model: [listadoItems:factura?.itemFactura, facturaInstance:factura, mapaTotales:getTotales(factura)])
	}
	
	def finalizar = {
		def factura = facturasService.obtenerFactura(params.id,session?.user?.username)
		factura.cobrar(true)
		if (facturasService.guardarFactura(factura)){
			log.warn "No se puedo guardar la Factura: ${params?.id}"
		}
		redirect(action: show, params:[id: factura?.id])
	}
	
	def finalizarSinCobro = {
		def factura = facturasService.obtenerFactura(params.id,session?.user?.username)
		factura.cobrar(false)
		if (facturasService.guardarFactura(factura)){
			log.warn "No se puedo guardar la Factura: ${params?.id}"
		}
		redirect(action: show, params:[id: factura?.id])
	}
	
	
	def eliminar = {
		facturasService.eliminarFactura(params.id)
	}
	
	def editar = {
//		def factura = facturasService.obtenerFactura(params.id,session?.user?.username)
//		render (view: "index", model: [facturaInstance: factura])
		render (view: "index", model: putParams(params))
	}
	
	def buscar = {
		if (params.id.isInteger()){
			if (facturasService.obtenerFactura(params.id,session?.user?.username)){
				redirect (action: "show", params:[id: params.id])
			}else{
				flash.message = "No se encontr&oacute; la factura buscada"
				redirect (action: "index")
			}
		}else{
			redirect (action: "show", controller: "egreso", params: [fecha: params.id])
		}
	}
	
}
